package com.infinit.easyreader.Biz;

import android.content.Context;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;

import com.infinit.easyreader.dao.BookDao;
import com.infinit.easyreader.dao.DirectoryDao;
import com.infinit.easyreader.entity.Book;
import com.infinit.easyreader.entity.Directory;
import com.infinit.easyreader.utils.CommonUtils;
import com.infinit.easyreader.utils.FindBookType;

import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;

/**
 * 类： BookBiz [V 1.0.0]
 * 包含类 : com.infinit.easyreader.Biz.BookBiz
 * 作用：处理书籍的相关业务
 * Created by rzy on 2016/1/30.
 */
public class BookBiz {
    /**
     * 从数据库中读取信息成功常量
     */
    public static final int FIND_BOOKS_SUCCESS = 1;
    /**
     * 从数据库中读取信息失败常量
     */

    public static final int FIND_BOOKS_FAIL = 2;
    private BookDao bookDao;
    private DirectoryDao dirDao;
    private Handler handler;

    public BookBiz(Context context, Handler handler) {
        this.handler = handler;
        dirDao = new DirectoryDao(context);
        bookDao = new BookDao(context);
    }

    /**
     * 作用：删除指定的书籍
     *
     * @param book 需要删除的书籍
     */

    public void deleteBook(Book book) {
        bookDao.deleteBooks(book);
        //删除SD卡下的文件
        String path = book.getPath();
        File file = new File(path);
        //noinspection ResultOfMethodCallIgnored
        file.delete();
    }


    /**
     * 作用：收藏指定的书籍
     *
     * @param book 书籍对象
     */
    public void collectBook(Book book) {
        book.setisFavorite(!book.isFavorite());
        bookDao.updateBooks(book);
    }


    /**
     * 作用：添加一本或者多本书籍
     *
     * @param path 路径
     */

    public void addBooks(String... path) {
        //将路径保存到Directory目录中
        for (String mPath : path) {
            File file = new File(mPath);
            if (!file.isDirectory()) {
                int index = file.getPath().lastIndexOf("/");
                mPath = mPath.substring(0, index);
            }
            Directory directory = new Directory();
            directory.setPath(mPath);
            directory.setAddTime(CommonUtils.format2String(Calendar.getInstance().getTime()));
            dirDao.insertDirectory(directory);
        }
    }


    /**
     * 作用：获取指定目录下的所有TXT文件
     *
     * @param dir 目录
     * @return 书籍列表
     */

    private List<Book> findAllTxt(Directory dir) {
        File file = new File(dir.getPath());
        File[] files = file.listFiles();
        List<Book> mList = new ArrayList<>();
        for (File mFile : files) {
            Book book = new Book();
            book.setDirectoryId(dir.getId());
            book.setPath(mFile.getAbsolutePath());
            book.setName(mFile.getName());
            mList.add(book);
        }
        return mList;
    }

    /**
     * 对比数据库中保存的文件和相应目录下的文件
     * 有新的书籍则更新
     */


    public List<Book> findAllTxtInfo(Directory dir) {
        List<Book> txtList = findAllTxt(dir);
        List<Book> bookList = bookDao.findBooksInDirectory(dir.getId());
        List<Book> correctList = new ArrayList<>();
        for (Book book : txtList) {
            if (bookList != null && bookList.contains(book)) {
                //如果文件夹有本书则查询本书的信息
                Book mBook = bookDao.findBook(book.getName());
                correctList.add(mBook);
            } else {
                //插入到数据库
                bookDao.insertBook(book);
                correctList.add(book);
            }
        }
        return correctList;
    }

    /**
     * 找到所有存在的所有已收藏的书籍
     */


    private List<Book> findAllCollected() {
        //首先找出所有的书籍，然后分别判断该书籍是否为已收藏
        //判断该书籍是否存在
        //本地部分
        List<Book> books;
        List<Book> collectedBooks = new ArrayList<>();
        books = bookDao.findAllBooks();
        if(books==null){
            return null;
        }
        for (Book book : books) {
            if (book.isFavorite()) {
                //判断该书籍是否存在
                if (new File(book.getPath()).exists()) {
                    collectedBooks.add(book);
                }
            }
        }
        Collections.sort(collectedBooks);
        return collectedBooks;
        //网络部分
    }

    /**
     * 关闭数据库连接
     */

    public void closeDatabase() {
        bookDao.finish();
    }


    /**
     * 添加指定的文件夹或者文件路径
     */

    /**
     * 从数据库中获取所有的书籍
     */

    public class FindBooksTask extends AsyncTask<FindBookType, Void, List<Book>> {
        @Override
        protected List<Book> doInBackground(FindBookType... params) {
            //从数据库中读取所有的目录
            switch (params[0]) {
                case ALL:
                    return findAllBooks();
                case COLLECTED:
                    return findAllCollected();
            }
            return null;

        }

        @Override
        protected void onPostExecute(List<Book> books) {

            if (books != null) {
                Message.obtain(handler, FIND_BOOKS_SUCCESS, books).sendToTarget();
            } else {
                Message.obtain(handler, FIND_BOOKS_FAIL).sendToTarget();
            }
        }

        /**
         * 找到所有的txt文件，并且更新相关的数据库
         */

        private List<Book> findAllBooks() {

            List<Directory> dirs = dirDao.findAll();
            if (dirs == null) {
                return null;
            } else {
                List<Book> books = new ArrayList<>();
                for (Directory dir : dirs) {

                    //根据目录找到指定文件中的Txt格式的文件
                    File mDir = new File(dir.getPath());
                    if (mDir.exists() && mDir.isDirectory()) {
                        List<Book> bookList = findAllTxtInfo(dir);
                        if (bookList != null) {
                            books.addAll(bookList);
                        }
                    } else {
                        //删除该目录下的所有书籍
                        bookDao.deleteBooks(dir);
                        //删除该目录
                        dirDao.deleteDir(dir);
                    }
                }
                Collections.sort(books);
                return books;
            }
        }
    }


}
